;
; Miracle Sudoku additional rules.
; These extend standard Sudoku with three extra constraints:
;
; 1. Anti-knight: No two cells a knight's move apart can have the same digit
; 2. Anti-king: No two diagonally adjacent cells can have the same digit
; 3. Non-consecutive: No two orthogonally adjacent cells can be consecutive
;
; Load this AFTER sudoku-rules.scm
;
(use-modules (opencog))

; ============================================================
; Non-consecutive predicate (string-based, intentionally ugly)
; Returns #t if the two values are NOT consecutive numbers.
; ============================================================

(define (not-consecutive-strings? a-name b-name)
  "Check if two number-word strings are NOT consecutive.
   Returns #t if they are NOT consecutive, #f if they ARE consecutive."
  (not
    (or
      ; one and two
      (and (string=? a-name "one") (string=? b-name "two"))
      (and (string=? a-name "two") (string=? b-name "one"))
      ; two and three
      (and (string=? a-name "two") (string=? b-name "three"))
      (and (string=? a-name "three") (string=? b-name "two"))
      ; three and four
      (and (string=? a-name "three") (string=? b-name "four"))
      (and (string=? a-name "four") (string=? b-name "three"))
      ; four and five
      (and (string=? a-name "four") (string=? b-name "five"))
      (and (string=? a-name "five") (string=? b-name "four"))
      ; five and six
      (and (string=? a-name "five") (string=? b-name "six"))
      (and (string=? a-name "six") (string=? b-name "five"))
      ; six and seven
      (and (string=? a-name "six") (string=? b-name "seven"))
      (and (string=? a-name "seven") (string=? b-name "six"))
      ; seven and eight
      (and (string=? a-name "seven") (string=? b-name "eight"))
      (and (string=? a-name "eight") (string=? b-name "seven"))
      ; eight and nine
      (and (string=? a-name "eight") (string=? b-name "nine"))
      (and (string=? a-name "nine") (string=? b-name "eight"))
    )))

; Wrapper for use as GroundedPredicate
; Takes a ListLink of two ConceptNodes
(define (not-consecutive? LIST)
  (let* ((outgoing (cog-outgoing-set LIST))
         (a (car outgoing))
         (b (cadr outgoing))
         (a-name (cog-name a))
         (b-name (cog-name b)))
    (not-consecutive-strings? a-name b-name)))

; ============================================================
; Anti-knight constraints
; Cells a knight's move apart must have different values.
; Knight moves: (±1, ±2) and (±2, ±1)
; ============================================================

(define (anti-knight-constraints)
  (list
    ; From row 1
    (ExclusiveLink (Variable "$cell_11") (Variable "$cell_23"))
    (ExclusiveLink (Variable "$cell_11") (Variable "$cell_32"))
    (ExclusiveLink (Variable "$cell_12") (Variable "$cell_24"))
    (ExclusiveLink (Variable "$cell_12") (Variable "$cell_31"))
    (ExclusiveLink (Variable "$cell_12") (Variable "$cell_33"))
    (ExclusiveLink (Variable "$cell_13") (Variable "$cell_21"))
    (ExclusiveLink (Variable "$cell_13") (Variable "$cell_25"))
    (ExclusiveLink (Variable "$cell_13") (Variable "$cell_32"))
    (ExclusiveLink (Variable "$cell_13") (Variable "$cell_34"))
    (ExclusiveLink (Variable "$cell_14") (Variable "$cell_22"))
    (ExclusiveLink (Variable "$cell_14") (Variable "$cell_26"))
    (ExclusiveLink (Variable "$cell_14") (Variable "$cell_33"))
    (ExclusiveLink (Variable "$cell_14") (Variable "$cell_35"))
    (ExclusiveLink (Variable "$cell_15") (Variable "$cell_23"))
    (ExclusiveLink (Variable "$cell_15") (Variable "$cell_27"))
    (ExclusiveLink (Variable "$cell_15") (Variable "$cell_34"))
    (ExclusiveLink (Variable "$cell_15") (Variable "$cell_36"))
    (ExclusiveLink (Variable "$cell_16") (Variable "$cell_24"))
    (ExclusiveLink (Variable "$cell_16") (Variable "$cell_28"))
    (ExclusiveLink (Variable "$cell_16") (Variable "$cell_35"))
    (ExclusiveLink (Variable "$cell_16") (Variable "$cell_37"))
    (ExclusiveLink (Variable "$cell_17") (Variable "$cell_25"))
    (ExclusiveLink (Variable "$cell_17") (Variable "$cell_29"))
    (ExclusiveLink (Variable "$cell_17") (Variable "$cell_36"))
    (ExclusiveLink (Variable "$cell_17") (Variable "$cell_38"))
    (ExclusiveLink (Variable "$cell_18") (Variable "$cell_26"))
    (ExclusiveLink (Variable "$cell_18") (Variable "$cell_37"))
    (ExclusiveLink (Variable "$cell_18") (Variable "$cell_39"))
    (ExclusiveLink (Variable "$cell_19") (Variable "$cell_27"))
    (ExclusiveLink (Variable "$cell_19") (Variable "$cell_38"))

    ; From row 2
    (ExclusiveLink (Variable "$cell_21") (Variable "$cell_33"))
    (ExclusiveLink (Variable "$cell_21") (Variable "$cell_42"))
    (ExclusiveLink (Variable "$cell_22") (Variable "$cell_34"))
    (ExclusiveLink (Variable "$cell_22") (Variable "$cell_41"))
    (ExclusiveLink (Variable "$cell_22") (Variable "$cell_43"))
    (ExclusiveLink (Variable "$cell_23") (Variable "$cell_31"))
    (ExclusiveLink (Variable "$cell_23") (Variable "$cell_35"))
    (ExclusiveLink (Variable "$cell_23") (Variable "$cell_42"))
    (ExclusiveLink (Variable "$cell_23") (Variable "$cell_44"))
    (ExclusiveLink (Variable "$cell_24") (Variable "$cell_32"))
    (ExclusiveLink (Variable "$cell_24") (Variable "$cell_36"))
    (ExclusiveLink (Variable "$cell_24") (Variable "$cell_43"))
    (ExclusiveLink (Variable "$cell_24") (Variable "$cell_45"))
    (ExclusiveLink (Variable "$cell_25") (Variable "$cell_33"))
    (ExclusiveLink (Variable "$cell_25") (Variable "$cell_37"))
    (ExclusiveLink (Variable "$cell_25") (Variable "$cell_44"))
    (ExclusiveLink (Variable "$cell_25") (Variable "$cell_46"))
    (ExclusiveLink (Variable "$cell_26") (Variable "$cell_34"))
    (ExclusiveLink (Variable "$cell_26") (Variable "$cell_38"))
    (ExclusiveLink (Variable "$cell_26") (Variable "$cell_45"))
    (ExclusiveLink (Variable "$cell_26") (Variable "$cell_47"))
    (ExclusiveLink (Variable "$cell_27") (Variable "$cell_35"))
    (ExclusiveLink (Variable "$cell_27") (Variable "$cell_39"))
    (ExclusiveLink (Variable "$cell_27") (Variable "$cell_46"))
    (ExclusiveLink (Variable "$cell_27") (Variable "$cell_48"))
    (ExclusiveLink (Variable "$cell_28") (Variable "$cell_36"))
    (ExclusiveLink (Variable "$cell_28") (Variable "$cell_47"))
    (ExclusiveLink (Variable "$cell_28") (Variable "$cell_49"))
    (ExclusiveLink (Variable "$cell_29") (Variable "$cell_37"))
    (ExclusiveLink (Variable "$cell_29") (Variable "$cell_48"))

    ; From row 3
    (ExclusiveLink (Variable "$cell_31") (Variable "$cell_43"))
    (ExclusiveLink (Variable "$cell_31") (Variable "$cell_52"))
    (ExclusiveLink (Variable "$cell_32") (Variable "$cell_44"))
    (ExclusiveLink (Variable "$cell_32") (Variable "$cell_51"))
    (ExclusiveLink (Variable "$cell_32") (Variable "$cell_53"))
    (ExclusiveLink (Variable "$cell_33") (Variable "$cell_41"))
    (ExclusiveLink (Variable "$cell_33") (Variable "$cell_45"))
    (ExclusiveLink (Variable "$cell_33") (Variable "$cell_52"))
    (ExclusiveLink (Variable "$cell_33") (Variable "$cell_54"))
    (ExclusiveLink (Variable "$cell_34") (Variable "$cell_42"))
    (ExclusiveLink (Variable "$cell_34") (Variable "$cell_46"))
    (ExclusiveLink (Variable "$cell_34") (Variable "$cell_53"))
    (ExclusiveLink (Variable "$cell_34") (Variable "$cell_55"))
    (ExclusiveLink (Variable "$cell_35") (Variable "$cell_43"))
    (ExclusiveLink (Variable "$cell_35") (Variable "$cell_47"))
    (ExclusiveLink (Variable "$cell_35") (Variable "$cell_54"))
    (ExclusiveLink (Variable "$cell_35") (Variable "$cell_56"))
    (ExclusiveLink (Variable "$cell_36") (Variable "$cell_44"))
    (ExclusiveLink (Variable "$cell_36") (Variable "$cell_48"))
    (ExclusiveLink (Variable "$cell_36") (Variable "$cell_55"))
    (ExclusiveLink (Variable "$cell_36") (Variable "$cell_57"))
    (ExclusiveLink (Variable "$cell_37") (Variable "$cell_45"))
    (ExclusiveLink (Variable "$cell_37") (Variable "$cell_49"))
    (ExclusiveLink (Variable "$cell_37") (Variable "$cell_56"))
    (ExclusiveLink (Variable "$cell_37") (Variable "$cell_58"))
    (ExclusiveLink (Variable "$cell_38") (Variable "$cell_46"))
    (ExclusiveLink (Variable "$cell_38") (Variable "$cell_57"))
    (ExclusiveLink (Variable "$cell_38") (Variable "$cell_59"))
    (ExclusiveLink (Variable "$cell_39") (Variable "$cell_47"))
    (ExclusiveLink (Variable "$cell_39") (Variable "$cell_58"))

    ; From row 4
    (ExclusiveLink (Variable "$cell_41") (Variable "$cell_53"))
    (ExclusiveLink (Variable "$cell_41") (Variable "$cell_62"))
    (ExclusiveLink (Variable "$cell_42") (Variable "$cell_54"))
    (ExclusiveLink (Variable "$cell_42") (Variable "$cell_61"))
    (ExclusiveLink (Variable "$cell_42") (Variable "$cell_63"))
    (ExclusiveLink (Variable "$cell_43") (Variable "$cell_51"))
    (ExclusiveLink (Variable "$cell_43") (Variable "$cell_55"))
    (ExclusiveLink (Variable "$cell_43") (Variable "$cell_62"))
    (ExclusiveLink (Variable "$cell_43") (Variable "$cell_64"))
    (ExclusiveLink (Variable "$cell_44") (Variable "$cell_52"))
    (ExclusiveLink (Variable "$cell_44") (Variable "$cell_56"))
    (ExclusiveLink (Variable "$cell_44") (Variable "$cell_63"))
    (ExclusiveLink (Variable "$cell_44") (Variable "$cell_65"))
    (ExclusiveLink (Variable "$cell_45") (Variable "$cell_53"))
    (ExclusiveLink (Variable "$cell_45") (Variable "$cell_57"))
    (ExclusiveLink (Variable "$cell_45") (Variable "$cell_64"))
    (ExclusiveLink (Variable "$cell_45") (Variable "$cell_66"))
    (ExclusiveLink (Variable "$cell_46") (Variable "$cell_54"))
    (ExclusiveLink (Variable "$cell_46") (Variable "$cell_58"))
    (ExclusiveLink (Variable "$cell_46") (Variable "$cell_65"))
    (ExclusiveLink (Variable "$cell_46") (Variable "$cell_67"))
    (ExclusiveLink (Variable "$cell_47") (Variable "$cell_55"))
    (ExclusiveLink (Variable "$cell_47") (Variable "$cell_59"))
    (ExclusiveLink (Variable "$cell_47") (Variable "$cell_66"))
    (ExclusiveLink (Variable "$cell_47") (Variable "$cell_68"))
    (ExclusiveLink (Variable "$cell_48") (Variable "$cell_56"))
    (ExclusiveLink (Variable "$cell_48") (Variable "$cell_67"))
    (ExclusiveLink (Variable "$cell_48") (Variable "$cell_69"))
    (ExclusiveLink (Variable "$cell_49") (Variable "$cell_57"))
    (ExclusiveLink (Variable "$cell_49") (Variable "$cell_68"))

    ; From row 5
    (ExclusiveLink (Variable "$cell_51") (Variable "$cell_63"))
    (ExclusiveLink (Variable "$cell_51") (Variable "$cell_72"))
    (ExclusiveLink (Variable "$cell_52") (Variable "$cell_64"))
    (ExclusiveLink (Variable "$cell_52") (Variable "$cell_71"))
    (ExclusiveLink (Variable "$cell_52") (Variable "$cell_73"))
    (ExclusiveLink (Variable "$cell_53") (Variable "$cell_61"))
    (ExclusiveLink (Variable "$cell_53") (Variable "$cell_65"))
    (ExclusiveLink (Variable "$cell_53") (Variable "$cell_72"))
    (ExclusiveLink (Variable "$cell_53") (Variable "$cell_74"))
    (ExclusiveLink (Variable "$cell_54") (Variable "$cell_62"))
    (ExclusiveLink (Variable "$cell_54") (Variable "$cell_66"))
    (ExclusiveLink (Variable "$cell_54") (Variable "$cell_73"))
    (ExclusiveLink (Variable "$cell_54") (Variable "$cell_75"))
    (ExclusiveLink (Variable "$cell_55") (Variable "$cell_63"))
    (ExclusiveLink (Variable "$cell_55") (Variable "$cell_67"))
    (ExclusiveLink (Variable "$cell_55") (Variable "$cell_74"))
    (ExclusiveLink (Variable "$cell_55") (Variable "$cell_76"))
    (ExclusiveLink (Variable "$cell_56") (Variable "$cell_64"))
    (ExclusiveLink (Variable "$cell_56") (Variable "$cell_68"))
    (ExclusiveLink (Variable "$cell_56") (Variable "$cell_75"))
    (ExclusiveLink (Variable "$cell_56") (Variable "$cell_77"))
    (ExclusiveLink (Variable "$cell_57") (Variable "$cell_65"))
    (ExclusiveLink (Variable "$cell_57") (Variable "$cell_69"))
    (ExclusiveLink (Variable "$cell_57") (Variable "$cell_76"))
    (ExclusiveLink (Variable "$cell_57") (Variable "$cell_78"))
    (ExclusiveLink (Variable "$cell_58") (Variable "$cell_66"))
    (ExclusiveLink (Variable "$cell_58") (Variable "$cell_77"))
    (ExclusiveLink (Variable "$cell_58") (Variable "$cell_79"))
    (ExclusiveLink (Variable "$cell_59") (Variable "$cell_67"))
    (ExclusiveLink (Variable "$cell_59") (Variable "$cell_78"))

    ; From row 6
    (ExclusiveLink (Variable "$cell_61") (Variable "$cell_73"))
    (ExclusiveLink (Variable "$cell_61") (Variable "$cell_82"))
    (ExclusiveLink (Variable "$cell_62") (Variable "$cell_74"))
    (ExclusiveLink (Variable "$cell_62") (Variable "$cell_81"))
    (ExclusiveLink (Variable "$cell_62") (Variable "$cell_83"))
    (ExclusiveLink (Variable "$cell_63") (Variable "$cell_71"))
    (ExclusiveLink (Variable "$cell_63") (Variable "$cell_75"))
    (ExclusiveLink (Variable "$cell_63") (Variable "$cell_82"))
    (ExclusiveLink (Variable "$cell_63") (Variable "$cell_84"))
    (ExclusiveLink (Variable "$cell_64") (Variable "$cell_72"))
    (ExclusiveLink (Variable "$cell_64") (Variable "$cell_76"))
    (ExclusiveLink (Variable "$cell_64") (Variable "$cell_83"))
    (ExclusiveLink (Variable "$cell_64") (Variable "$cell_85"))
    (ExclusiveLink (Variable "$cell_65") (Variable "$cell_73"))
    (ExclusiveLink (Variable "$cell_65") (Variable "$cell_77"))
    (ExclusiveLink (Variable "$cell_65") (Variable "$cell_84"))
    (ExclusiveLink (Variable "$cell_65") (Variable "$cell_86"))
    (ExclusiveLink (Variable "$cell_66") (Variable "$cell_74"))
    (ExclusiveLink (Variable "$cell_66") (Variable "$cell_78"))
    (ExclusiveLink (Variable "$cell_66") (Variable "$cell_85"))
    (ExclusiveLink (Variable "$cell_66") (Variable "$cell_87"))
    (ExclusiveLink (Variable "$cell_67") (Variable "$cell_75"))
    (ExclusiveLink (Variable "$cell_67") (Variable "$cell_79"))
    (ExclusiveLink (Variable "$cell_67") (Variable "$cell_86"))
    (ExclusiveLink (Variable "$cell_67") (Variable "$cell_88"))
    (ExclusiveLink (Variable "$cell_68") (Variable "$cell_76"))
    (ExclusiveLink (Variable "$cell_68") (Variable "$cell_87"))
    (ExclusiveLink (Variable "$cell_68") (Variable "$cell_89"))
    (ExclusiveLink (Variable "$cell_69") (Variable "$cell_77"))
    (ExclusiveLink (Variable "$cell_69") (Variable "$cell_88"))

    ; From row 7
    (ExclusiveLink (Variable "$cell_71") (Variable "$cell_83"))
    (ExclusiveLink (Variable "$cell_71") (Variable "$cell_92"))
    (ExclusiveLink (Variable "$cell_72") (Variable "$cell_84"))
    (ExclusiveLink (Variable "$cell_72") (Variable "$cell_91"))
    (ExclusiveLink (Variable "$cell_72") (Variable "$cell_93"))
    (ExclusiveLink (Variable "$cell_73") (Variable "$cell_81"))
    (ExclusiveLink (Variable "$cell_73") (Variable "$cell_85"))
    (ExclusiveLink (Variable "$cell_73") (Variable "$cell_92"))
    (ExclusiveLink (Variable "$cell_73") (Variable "$cell_94"))
    (ExclusiveLink (Variable "$cell_74") (Variable "$cell_82"))
    (ExclusiveLink (Variable "$cell_74") (Variable "$cell_86"))
    (ExclusiveLink (Variable "$cell_74") (Variable "$cell_93"))
    (ExclusiveLink (Variable "$cell_74") (Variable "$cell_95"))
    (ExclusiveLink (Variable "$cell_75") (Variable "$cell_83"))
    (ExclusiveLink (Variable "$cell_75") (Variable "$cell_87"))
    (ExclusiveLink (Variable "$cell_75") (Variable "$cell_94"))
    (ExclusiveLink (Variable "$cell_75") (Variable "$cell_96"))
    (ExclusiveLink (Variable "$cell_76") (Variable "$cell_84"))
    (ExclusiveLink (Variable "$cell_76") (Variable "$cell_88"))
    (ExclusiveLink (Variable "$cell_76") (Variable "$cell_95"))
    (ExclusiveLink (Variable "$cell_76") (Variable "$cell_97"))
    (ExclusiveLink (Variable "$cell_77") (Variable "$cell_85"))
    (ExclusiveLink (Variable "$cell_77") (Variable "$cell_89"))
    (ExclusiveLink (Variable "$cell_77") (Variable "$cell_96"))
    (ExclusiveLink (Variable "$cell_77") (Variable "$cell_98"))
    (ExclusiveLink (Variable "$cell_78") (Variable "$cell_86"))
    (ExclusiveLink (Variable "$cell_78") (Variable "$cell_97"))
    (ExclusiveLink (Variable "$cell_78") (Variable "$cell_99"))
    (ExclusiveLink (Variable "$cell_79") (Variable "$cell_87"))
    (ExclusiveLink (Variable "$cell_79") (Variable "$cell_98"))

    ; From row 8
    (ExclusiveLink (Variable "$cell_81") (Variable "$cell_93"))
    (ExclusiveLink (Variable "$cell_82") (Variable "$cell_94"))
    (ExclusiveLink (Variable "$cell_83") (Variable "$cell_91"))
    (ExclusiveLink (Variable "$cell_83") (Variable "$cell_95"))
    (ExclusiveLink (Variable "$cell_84") (Variable "$cell_92"))
    (ExclusiveLink (Variable "$cell_84") (Variable "$cell_96"))
    (ExclusiveLink (Variable "$cell_85") (Variable "$cell_93"))
    (ExclusiveLink (Variable "$cell_85") (Variable "$cell_97"))
    (ExclusiveLink (Variable "$cell_86") (Variable "$cell_94"))
    (ExclusiveLink (Variable "$cell_86") (Variable "$cell_98"))
    (ExclusiveLink (Variable "$cell_87") (Variable "$cell_95"))
    (ExclusiveLink (Variable "$cell_87") (Variable "$cell_99"))
    (ExclusiveLink (Variable "$cell_88") (Variable "$cell_96"))
    (ExclusiveLink (Variable "$cell_89") (Variable "$cell_97"))

    ; From row 9 - only upward knight moves remain (downward are off-grid)
    (ExclusiveLink (Variable "$cell_93") (Variable "$cell_81"))
    (ExclusiveLink (Variable "$cell_94") (Variable "$cell_82"))
    (ExclusiveLink (Variable "$cell_95") (Variable "$cell_83"))
    (ExclusiveLink (Variable "$cell_96") (Variable "$cell_84"))
    (ExclusiveLink (Variable "$cell_97") (Variable "$cell_85"))
    (ExclusiveLink (Variable "$cell_98") (Variable "$cell_86"))
    (ExclusiveLink (Variable "$cell_99") (Variable "$cell_87"))
  ))

; ============================================================
; Anti-king constraints (diagonal adjacency only)
; Orthogonal adjacency is already covered by row/column constraints.
; ============================================================

(define (anti-king-constraints)
  (list
    ; Row 1-2 diagonals
    (ExclusiveLink (Variable "$cell_11") (Variable "$cell_22"))
    (ExclusiveLink (Variable "$cell_12") (Variable "$cell_21"))
    (ExclusiveLink (Variable "$cell_12") (Variable "$cell_23"))
    (ExclusiveLink (Variable "$cell_13") (Variable "$cell_22"))
    (ExclusiveLink (Variable "$cell_13") (Variable "$cell_24"))
    (ExclusiveLink (Variable "$cell_14") (Variable "$cell_23"))
    (ExclusiveLink (Variable "$cell_14") (Variable "$cell_25"))
    (ExclusiveLink (Variable "$cell_15") (Variable "$cell_24"))
    (ExclusiveLink (Variable "$cell_15") (Variable "$cell_26"))
    (ExclusiveLink (Variable "$cell_16") (Variable "$cell_25"))
    (ExclusiveLink (Variable "$cell_16") (Variable "$cell_27"))
    (ExclusiveLink (Variable "$cell_17") (Variable "$cell_26"))
    (ExclusiveLink (Variable "$cell_17") (Variable "$cell_28"))
    (ExclusiveLink (Variable "$cell_18") (Variable "$cell_27"))
    (ExclusiveLink (Variable "$cell_18") (Variable "$cell_29"))
    (ExclusiveLink (Variable "$cell_19") (Variable "$cell_28"))

    ; Row 2-3 diagonals
    (ExclusiveLink (Variable "$cell_21") (Variable "$cell_32"))
    (ExclusiveLink (Variable "$cell_22") (Variable "$cell_31"))
    (ExclusiveLink (Variable "$cell_22") (Variable "$cell_33"))
    (ExclusiveLink (Variable "$cell_23") (Variable "$cell_32"))
    (ExclusiveLink (Variable "$cell_23") (Variable "$cell_34"))
    (ExclusiveLink (Variable "$cell_24") (Variable "$cell_33"))
    (ExclusiveLink (Variable "$cell_24") (Variable "$cell_35"))
    (ExclusiveLink (Variable "$cell_25") (Variable "$cell_34"))
    (ExclusiveLink (Variable "$cell_25") (Variable "$cell_36"))
    (ExclusiveLink (Variable "$cell_26") (Variable "$cell_35"))
    (ExclusiveLink (Variable "$cell_26") (Variable "$cell_37"))
    (ExclusiveLink (Variable "$cell_27") (Variable "$cell_36"))
    (ExclusiveLink (Variable "$cell_27") (Variable "$cell_38"))
    (ExclusiveLink (Variable "$cell_28") (Variable "$cell_37"))
    (ExclusiveLink (Variable "$cell_28") (Variable "$cell_39"))
    (ExclusiveLink (Variable "$cell_29") (Variable "$cell_38"))

    ; Row 3-4 diagonals
    (ExclusiveLink (Variable "$cell_31") (Variable "$cell_42"))
    (ExclusiveLink (Variable "$cell_32") (Variable "$cell_41"))
    (ExclusiveLink (Variable "$cell_32") (Variable "$cell_43"))
    (ExclusiveLink (Variable "$cell_33") (Variable "$cell_42"))
    (ExclusiveLink (Variable "$cell_33") (Variable "$cell_44"))
    (ExclusiveLink (Variable "$cell_34") (Variable "$cell_43"))
    (ExclusiveLink (Variable "$cell_34") (Variable "$cell_45"))
    (ExclusiveLink (Variable "$cell_35") (Variable "$cell_44"))
    (ExclusiveLink (Variable "$cell_35") (Variable "$cell_46"))
    (ExclusiveLink (Variable "$cell_36") (Variable "$cell_45"))
    (ExclusiveLink (Variable "$cell_36") (Variable "$cell_47"))
    (ExclusiveLink (Variable "$cell_37") (Variable "$cell_46"))
    (ExclusiveLink (Variable "$cell_37") (Variable "$cell_48"))
    (ExclusiveLink (Variable "$cell_38") (Variable "$cell_47"))
    (ExclusiveLink (Variable "$cell_38") (Variable "$cell_49"))
    (ExclusiveLink (Variable "$cell_39") (Variable "$cell_48"))

    ; Row 4-5 diagonals
    (ExclusiveLink (Variable "$cell_41") (Variable "$cell_52"))
    (ExclusiveLink (Variable "$cell_42") (Variable "$cell_51"))
    (ExclusiveLink (Variable "$cell_42") (Variable "$cell_53"))
    (ExclusiveLink (Variable "$cell_43") (Variable "$cell_52"))
    (ExclusiveLink (Variable "$cell_43") (Variable "$cell_54"))
    (ExclusiveLink (Variable "$cell_44") (Variable "$cell_53"))
    (ExclusiveLink (Variable "$cell_44") (Variable "$cell_55"))
    (ExclusiveLink (Variable "$cell_45") (Variable "$cell_54"))
    (ExclusiveLink (Variable "$cell_45") (Variable "$cell_56"))
    (ExclusiveLink (Variable "$cell_46") (Variable "$cell_55"))
    (ExclusiveLink (Variable "$cell_46") (Variable "$cell_57"))
    (ExclusiveLink (Variable "$cell_47") (Variable "$cell_56"))
    (ExclusiveLink (Variable "$cell_47") (Variable "$cell_58"))
    (ExclusiveLink (Variable "$cell_48") (Variable "$cell_57"))
    (ExclusiveLink (Variable "$cell_48") (Variable "$cell_59"))
    (ExclusiveLink (Variable "$cell_49") (Variable "$cell_58"))

    ; Row 5-6 diagonals
    (ExclusiveLink (Variable "$cell_51") (Variable "$cell_62"))
    (ExclusiveLink (Variable "$cell_52") (Variable "$cell_61"))
    (ExclusiveLink (Variable "$cell_52") (Variable "$cell_63"))
    (ExclusiveLink (Variable "$cell_53") (Variable "$cell_62"))
    (ExclusiveLink (Variable "$cell_53") (Variable "$cell_64"))
    (ExclusiveLink (Variable "$cell_54") (Variable "$cell_63"))
    (ExclusiveLink (Variable "$cell_54") (Variable "$cell_65"))
    (ExclusiveLink (Variable "$cell_55") (Variable "$cell_64"))
    (ExclusiveLink (Variable "$cell_55") (Variable "$cell_66"))
    (ExclusiveLink (Variable "$cell_56") (Variable "$cell_65"))
    (ExclusiveLink (Variable "$cell_56") (Variable "$cell_67"))
    (ExclusiveLink (Variable "$cell_57") (Variable "$cell_66"))
    (ExclusiveLink (Variable "$cell_57") (Variable "$cell_68"))
    (ExclusiveLink (Variable "$cell_58") (Variable "$cell_67"))
    (ExclusiveLink (Variable "$cell_58") (Variable "$cell_69"))
    (ExclusiveLink (Variable "$cell_59") (Variable "$cell_68"))

    ; Row 6-7 diagonals
    (ExclusiveLink (Variable "$cell_61") (Variable "$cell_72"))
    (ExclusiveLink (Variable "$cell_62") (Variable "$cell_71"))
    (ExclusiveLink (Variable "$cell_62") (Variable "$cell_73"))
    (ExclusiveLink (Variable "$cell_63") (Variable "$cell_72"))
    (ExclusiveLink (Variable "$cell_63") (Variable "$cell_74"))
    (ExclusiveLink (Variable "$cell_64") (Variable "$cell_73"))
    (ExclusiveLink (Variable "$cell_64") (Variable "$cell_75"))
    (ExclusiveLink (Variable "$cell_65") (Variable "$cell_74"))
    (ExclusiveLink (Variable "$cell_65") (Variable "$cell_76"))
    (ExclusiveLink (Variable "$cell_66") (Variable "$cell_75"))
    (ExclusiveLink (Variable "$cell_66") (Variable "$cell_77"))
    (ExclusiveLink (Variable "$cell_67") (Variable "$cell_76"))
    (ExclusiveLink (Variable "$cell_67") (Variable "$cell_78"))
    (ExclusiveLink (Variable "$cell_68") (Variable "$cell_77"))
    (ExclusiveLink (Variable "$cell_68") (Variable "$cell_79"))
    (ExclusiveLink (Variable "$cell_69") (Variable "$cell_78"))

    ; Row 7-8 diagonals
    (ExclusiveLink (Variable "$cell_71") (Variable "$cell_82"))
    (ExclusiveLink (Variable "$cell_72") (Variable "$cell_81"))
    (ExclusiveLink (Variable "$cell_72") (Variable "$cell_83"))
    (ExclusiveLink (Variable "$cell_73") (Variable "$cell_82"))
    (ExclusiveLink (Variable "$cell_73") (Variable "$cell_84"))
    (ExclusiveLink (Variable "$cell_74") (Variable "$cell_83"))
    (ExclusiveLink (Variable "$cell_74") (Variable "$cell_85"))
    (ExclusiveLink (Variable "$cell_75") (Variable "$cell_84"))
    (ExclusiveLink (Variable "$cell_75") (Variable "$cell_86"))
    (ExclusiveLink (Variable "$cell_76") (Variable "$cell_85"))
    (ExclusiveLink (Variable "$cell_76") (Variable "$cell_87"))
    (ExclusiveLink (Variable "$cell_77") (Variable "$cell_86"))
    (ExclusiveLink (Variable "$cell_77") (Variable "$cell_88"))
    (ExclusiveLink (Variable "$cell_78") (Variable "$cell_87"))
    (ExclusiveLink (Variable "$cell_78") (Variable "$cell_89"))
    (ExclusiveLink (Variable "$cell_79") (Variable "$cell_88"))

    ; Row 8-9 diagonals
    (ExclusiveLink (Variable "$cell_81") (Variable "$cell_92"))
    (ExclusiveLink (Variable "$cell_82") (Variable "$cell_91"))
    (ExclusiveLink (Variable "$cell_82") (Variable "$cell_93"))
    (ExclusiveLink (Variable "$cell_83") (Variable "$cell_92"))
    (ExclusiveLink (Variable "$cell_83") (Variable "$cell_94"))
    (ExclusiveLink (Variable "$cell_84") (Variable "$cell_93"))
    (ExclusiveLink (Variable "$cell_84") (Variable "$cell_95"))
    (ExclusiveLink (Variable "$cell_85") (Variable "$cell_94"))
    (ExclusiveLink (Variable "$cell_85") (Variable "$cell_96"))
    (ExclusiveLink (Variable "$cell_86") (Variable "$cell_95"))
    (ExclusiveLink (Variable "$cell_86") (Variable "$cell_97"))
    (ExclusiveLink (Variable "$cell_87") (Variable "$cell_96"))
    (ExclusiveLink (Variable "$cell_87") (Variable "$cell_98"))
    (ExclusiveLink (Variable "$cell_88") (Variable "$cell_97"))
    (ExclusiveLink (Variable "$cell_88") (Variable "$cell_99"))
    (ExclusiveLink (Variable "$cell_89") (Variable "$cell_98"))
  ))

; ============================================================
; Non-consecutive constraints
; Orthogonally adjacent cells cannot have consecutive values.
; Uses GroundedPredicate with ugly string comparison.
; ============================================================

(define (non-consecutive-constraints)
  (list
    ; Row 1 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_11") (Variable "$cell_12")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_12") (Variable "$cell_13")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_13") (Variable "$cell_14")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_14") (Variable "$cell_15")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_15") (Variable "$cell_16")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_16") (Variable "$cell_17")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_17") (Variable "$cell_18")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_18") (Variable "$cell_19")))

    ; Row 2 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_21") (Variable "$cell_22")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_22") (Variable "$cell_23")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_23") (Variable "$cell_24")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_24") (Variable "$cell_25")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_25") (Variable "$cell_26")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_26") (Variable "$cell_27")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_27") (Variable "$cell_28")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_28") (Variable "$cell_29")))

    ; Row 3 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_31") (Variable "$cell_32")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_32") (Variable "$cell_33")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_33") (Variable "$cell_34")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_34") (Variable "$cell_35")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_35") (Variable "$cell_36")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_36") (Variable "$cell_37")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_37") (Variable "$cell_38")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_38") (Variable "$cell_39")))

    ; Row 4 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_41") (Variable "$cell_42")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_42") (Variable "$cell_43")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_43") (Variable "$cell_44")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_44") (Variable "$cell_45")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_45") (Variable "$cell_46")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_46") (Variable "$cell_47")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_47") (Variable "$cell_48")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_48") (Variable "$cell_49")))

    ; Row 5 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_51") (Variable "$cell_52")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_52") (Variable "$cell_53")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_53") (Variable "$cell_54")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_54") (Variable "$cell_55")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_55") (Variable "$cell_56")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_56") (Variable "$cell_57")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_57") (Variable "$cell_58")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_58") (Variable "$cell_59")))

    ; Row 6 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_61") (Variable "$cell_62")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_62") (Variable "$cell_63")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_63") (Variable "$cell_64")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_64") (Variable "$cell_65")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_65") (Variable "$cell_66")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_66") (Variable "$cell_67")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_67") (Variable "$cell_68")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_68") (Variable "$cell_69")))

    ; Row 7 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_71") (Variable "$cell_72")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_72") (Variable "$cell_73")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_73") (Variable "$cell_74")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_74") (Variable "$cell_75")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_75") (Variable "$cell_76")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_76") (Variable "$cell_77")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_77") (Variable "$cell_78")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_78") (Variable "$cell_79")))

    ; Row 8 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_81") (Variable "$cell_82")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_82") (Variable "$cell_83")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_83") (Variable "$cell_84")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_84") (Variable "$cell_85")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_85") (Variable "$cell_86")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_86") (Variable "$cell_87")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_87") (Variable "$cell_88")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_88") (Variable "$cell_89")))

    ; Row 9 horizontal pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_91") (Variable "$cell_92")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_92") (Variable "$cell_93")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_93") (Variable "$cell_94")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_94") (Variable "$cell_95")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_95") (Variable "$cell_96")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_96") (Variable "$cell_97")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_97") (Variable "$cell_98")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_98") (Variable "$cell_99")))

    ; Column 1 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_11") (Variable "$cell_21")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_21") (Variable "$cell_31")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_31") (Variable "$cell_41")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_41") (Variable "$cell_51")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_51") (Variable "$cell_61")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_61") (Variable "$cell_71")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_71") (Variable "$cell_81")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_81") (Variable "$cell_91")))

    ; Column 2 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_12") (Variable "$cell_22")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_22") (Variable "$cell_32")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_32") (Variable "$cell_42")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_42") (Variable "$cell_52")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_52") (Variable "$cell_62")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_62") (Variable "$cell_72")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_72") (Variable "$cell_82")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_82") (Variable "$cell_92")))

    ; Column 3 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_13") (Variable "$cell_23")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_23") (Variable "$cell_33")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_33") (Variable "$cell_43")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_43") (Variable "$cell_53")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_53") (Variable "$cell_63")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_63") (Variable "$cell_73")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_73") (Variable "$cell_83")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_83") (Variable "$cell_93")))

    ; Column 4 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_14") (Variable "$cell_24")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_24") (Variable "$cell_34")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_34") (Variable "$cell_44")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_44") (Variable "$cell_54")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_54") (Variable "$cell_64")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_64") (Variable "$cell_74")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_74") (Variable "$cell_84")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_84") (Variable "$cell_94")))

    ; Column 5 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_15") (Variable "$cell_25")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_25") (Variable "$cell_35")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_35") (Variable "$cell_45")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_45") (Variable "$cell_55")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_55") (Variable "$cell_65")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_65") (Variable "$cell_75")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_75") (Variable "$cell_85")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_85") (Variable "$cell_95")))

    ; Column 6 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_16") (Variable "$cell_26")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_26") (Variable "$cell_36")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_36") (Variable "$cell_46")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_46") (Variable "$cell_56")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_56") (Variable "$cell_66")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_66") (Variable "$cell_76")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_76") (Variable "$cell_86")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_86") (Variable "$cell_96")))

    ; Column 7 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_17") (Variable "$cell_27")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_27") (Variable "$cell_37")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_37") (Variable "$cell_47")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_47") (Variable "$cell_57")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_57") (Variable "$cell_67")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_67") (Variable "$cell_77")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_77") (Variable "$cell_87")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_87") (Variable "$cell_97")))

    ; Column 8 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_18") (Variable "$cell_28")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_28") (Variable "$cell_38")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_38") (Variable "$cell_48")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_48") (Variable "$cell_58")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_58") (Variable "$cell_68")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_68") (Variable "$cell_78")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_78") (Variable "$cell_88")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_88") (Variable "$cell_98")))

    ; Column 9 vertical pairs
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_19") (Variable "$cell_29")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_29") (Variable "$cell_39")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_39") (Variable "$cell_49")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_49") (Variable "$cell_59")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_59") (Variable "$cell_69")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_69") (Variable "$cell_79")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_79") (Variable "$cell_89")))
    (Evaluation (GroundedPredicate "scm:not-consecutive?")
      (List (Variable "$cell_89") (Variable "$cell_99")))
  ))

; ============================================================
; Combined miracle constraints
; ============================================================

(define (miracle-constraints)
  (append
    (anti-knight-constraints)
    (anti-king-constraints)
    (non-consecutive-constraints)))

; Full miracle sudoku constraints (standard + miracle)
(define (miracle-sudoku-constraints)
  (append
    (sudoku-constraints)
    (miracle-constraints)))
